#include "usart.h"
#include "protocol.h"

/************************************************
函数名称 ： USART_GPIO_Configuration
功    能 ： USART所使用管脚输出输入定义
参    数 ： 无
返 回 值 ： 无
作    者 ： strongerHuang
*************************************************/
void USART1_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);  
	  
	
/* Connect GPIOs to USART1 RX&TX  */
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);     //Tx
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);    //Rx
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;      //USART1_TX | USART1_RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
	GPIO_Init(GPIOA, &GPIO_InitStructure);  
	
	USART_InitTypeDef USART_InitStructure;      
	USART_InitStructure.USART_BaudRate = RS232_BAUD;    
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;  
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;    
	USART_Init(USART1,&USART_InitStructure);    
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	USART_Cmd(USART1,ENABLE);
	
	NVIC_InitTypeDef NVIC_InitStructure;
/*****USART1 interrupt Config****/
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void USART1_ConfigBound(uint32_t bound)
{
	USART_InitTypeDef USART_InitStructure;      
	USART_InitStructure.USART_BaudRate = bound;    
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;  
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;    
	USART_Init(USART1,&USART_InitStructure);    
	USART_Cmd(USART1,ENABLE);
}
/************************************************
函数名称 ： USART1_IRQHandler
功    能 ： USART1中断
参    数 ： 无
返 回 值 ： 无
作    者 ： 
*************************************************/
void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
		uint8_t res=USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		msgParse(res, &msg);
	}
}




/************************************************
函数名称 ： USART1_SendByte
功    能 ： 串口1发送一字节数据
参    数 ： Data --- 数据
返 回 值 ： 无
*************************************************/
void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data)
{
  while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) != SET);
	USART_SendData(USARTx, Data);
}



void USART_SendBuf(USART_TypeDef* USARTx, uint8_t *Data, uint8_t len)
{
	for(uint8_t i=0;i<len;i++)
	{
		USART_SendByte(USARTx, Data[i]);
	}
}

/************************************************
函数名称 ： USART1_SendNByte
功    能 ： 串口1发送N个字符
参    数 ： pData ----- 字符串
            Length --- 长度
返 回 值 ： 无
*************************************************/
void USART_SendNByte(USART_TypeDef* USARTx, uint8_t *pData, uint16_t Length)
{
  while(Length--)
  {
    USART_SendByte(USARTx, *pData);
    pData++;
  }
}



void USART_PutStr(USART_TypeDef* USARTx, char *STR)
{
	while(*STR)
	{
		USART_SendByte(USARTx, *STR++);
	}
}



